// 柯里化
function curry(fn) {
	return function curried(...args) {
		if (args.length >= fn.length) { //如果参数第一步就传递够了
			return fn.apply(this, args); //有可能在调用的时候需要改变this指向，我们这里用进行this的绑定
		} else { //参数不够，需要返回一个新的参数，继续来接收剩余的参数（对curried进行回调）
			return function(...newArgs) {
				return curried.apply(this, args.concat(newArgs));
			}
		}
	}
}

function add(a, b, c) {
	return a + b + c;
}

const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1)(2, 3)); // 6